三种页面置换算法C实现

#include "stdio.h"
#include "stdlib.h"

typedef struct item
{
    int num;        //页号
    int time;        //等待时间,LRU算法会用到这个属性
}Pro;

int pageNum;        //系统分配给作业的主存中的页面数
int memoryNum;        //可用内存页面数

void print(Pro *page1);        //打印当前主存中的页面
int  Search(int num1, Pro *memory1);    //在页面集memory1中查找num1,如果找到,返回其在memory1中的下标,否则返回-1
int Max(Pro *memory1);
int optimal(int num,int tag,Pro *memory1,Pro *page1);

int main(void)
{
    int i;
    int curmemory;        //调入主存中的页面个数
    int missNum;        //缺页次数
    float missRate;        //缺页率
    char c;                //得到用户的输入字符,来选择相应的置换算法

    Pro *page;            //作业页面集
    Pro *memory;        //内存页面集

    printf("输入系统分配给作业的主存中的页面数:");
    scanf("%d", &pageNum);    
    printf("输入内存页面数:");
    scanf("%d", &memoryNum);
    
    page= (Pro*)malloc(sizeof(Pro)*pageNum);
    memory= (Pro*)malloc(sizeof(Pro)*memoryNum);

    for(i=0;i<pageNum;i++)
    {
        printf("第 %d 个页面号为:", i);
        scanf("%d", &page[i].num);
        page[i].time=0;            //等待时间开始默认为0
    }

    do{
        for(i=0;i<memoryNum;i++)        //初始化内存中页面
        {
            memory[i].num=-1;                //页面为空用-1表示
            memory[i].time=-1;                //
        }     

        printf("*****f:FIFO页面置换*****\n");
        printf("*****o:OPT页面置换*****\n");
        printf("*****l:LRU页面置换*****\n");
        printf("*****请选择操作类型(f,o,l),按其它键结束******\n");
        fflush(stdin);
        scanf("%c", &c);
        
        i = 0;
        curmemory = 0;

        if(c=='f')            //FIFO页面置换
        {
            missNum = 0;            

            printf("FIFO页面置换情况:   \n");
            for(i=0;i<pageNum;i++)
            {
                if(Search(page[i].num,memory)<0)//若在主存中没有找到该页面
                {
                    missNum ++;
                    memory[curmemory].num=page[i].num;
                    print(memory);
                    curmemory = (curmemory+1)%memoryNum;
                }
            }//end for
            missRate = (float)missNum/pageNum;
            printf("缺页次数:%d   缺页率:  %f\n", missNum, missRate);

        }//end if

        if(c=='o')            //OPT页面置换
        {
            missNum = 0;            

            printf("OPT页面置换情况:   \n");
            for(i=0;i<pageNum;i++)
            {
                if(Search(page[i].num,memory)<0)//若在主存中没有找到该页面
                {
                    if(i<memoryNum)
                        curmemory = i;
                    else
                        curmemory = optimal(page[i].num,i,memory,page);
                    missNum ++;
                    memory[curmemory].num=page[i].num;
                    print(memory);
                    curmemory = (curmemory+1)%memoryNum;
                }
            }//end for
            missRate = (float)missNum/pageNum;
            printf("缺页次数:%d   缺页率:  %.2f%%\n", missNum, missRate*100);


        }//end if

        if(c=='l')            //LRU页面置换
        {
            missNum = 0;            

            printf("LRU页面置换情况:   \n");
            for(i=0;i<pageNum;i++)
            {
                for(int j=0;j<memoryNum;j++)
                {
                    if(memory[j].num>=0)
                        memory[j].time++;
                }
                if(Search(page[i].num,memory)<0)//若在主存中没有找到该页面
                {
                    missNum ++;
                //    printf("%d \n",curmemory);
                    if(i<3)
                        curmemory = i;
                    else
                        curmemory = Max(memory);

                    memory[curmemory].num=page[i].num;
                    memory[curmemory].time = 0;
                    print(memory);
                    curmemory = (curmemory+1)%memoryNum;
                }
                else
                {
                    curmemory = Search(page[i].num,memory);
                    memory[curmemory].time=0;
                    curmemory = (curmemory+1)%memoryNum;
                }

            }//end for
            missRate = (float)missNum/pageNum;
            printf("缺页次数:%d   缺页率:  %.2f%%\n", missNum, missRate*100);



        }//end if

    }while(c=='f'||c=='l'||c=='o');


    return 0;
}


void print(Pro *memory1)//打印当前的页面
{
    int j;

    for(j=0;j<memoryNum;j++)
        printf("%d ", memory1[j].num);
    printf("\n");
}

//在页面集memory1中查找num1,如果找到,返回其在memory1中的下标,否则返回-1
int  Search(int num1,Pro *memory1  )
{
    int j;

    for(j=0;j<memoryNum;j++)
    {
        if(num1==memory1[j].num)
            return j;            
    }
    return -1;
}  
int Max(Pro *memory1)
{
    int max = 0;

    for(int k=1;k<memoryNum;k++)
    {
        if(memory1[k].time > memory1[max].time)
            max = k;
    }
    return max;
}

int optimal(int num,int tag,Pro *memory1,Pro *page1)
{
    int k,j,min[100],min_k;
    for(k=0;k<memoryNum;k++)
        min[k] = 500;
    for(k=0;k<memoryNum;k++)
    {
        j = tag;
        do{
    
            j++;
            if(j>20)
                break;
        }while(page1[j].num!=memory1[k].num);
        if(j<min[k])
        {
    
            min[k] = j;
        }
    }
    int max = 0;
    for(int t=1;t<memoryNum;t++)
    {
        if(min[t]>min[max])
            max = t;
    }
    return max;
}

  • 16
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以为您提供一个常见的最佳置换算法的c语言实现示例,以进行页面置换算法。 下面是示例代码: #include <stdio.h> #include <stdlib.h> #define MAX_PAGES 100 #define MAX_REFERENCES 1000 #define MAX_FRAMES 10 int pages[MAX_REFERENCES]; int frames[MAX_FRAMES]; int next_use[MAX_FRAMES]; int n_pages, n_references, n_frames; void init() { int i; for (i = 0; i < n_frames; i++) { frames[i] = -1; next_use[i] = 0; } return; } int find_remove_best_frame() { int i, best_frame = 0; for (i = 0; i < n_frames; i++) { if (next_use[i] > next_use[best_frame]) { best_frame = i; } } frames[best_frame] = pages[n_pages]; next_use[best_frame] = 0; return best_frame; } int find_available_frame() { int i; for (i = 0; i < n_frames; i++) { if (frames[i] == -1) { return i; } } return find_remove_best_frame(); } void update_next_use(int frame) { int i; for (i = 0; i < n_frames; i++) { if (frames[i] != -1 && i != frame) { next_use[i]++; } } next_use[frame] = 0; return; } void print_frames() { int i; for (i = 0; i < n_frames; i++) { if (frames[i] != -1) { printf("%d ", frames[i]); } } printf("\n"); return; } void simulate() { int i, page_faults = 0; init(); for (i = 0; i < n_references; i++) { n_pages = i; int page = pages[i]; int frame = find_frame(page); if (frame == -1) { int available = find_available_frame(); frames[available] = page; page_faults++; update_next_use(available); } else { update_next_use(frame); } print_frames(); } printf("Number of page faults: %d\n", page_faults); return; } int main() { int i; printf("Enter the number of pages: "); scanf("%d", &n_pages); printf("Enter the references string: "); for (i = 0; i < n_pages; i++) { scanf("%d", &pages[i]); } printf("Enter the number of frames: "); scanf("%d", &n_frames); printf("Simulating with best-fit algorithm...\n"); simulate(); return 0; } 在这个C程序中,我们定义了一个名为pages的数组,其中存储了参考字符串。我们还定义了一个名为frames的数组,它代表了内存中的框架。我们还定义了一个名为next_use的数组,该数组用于跟踪下一次在每个帧中使用的页面。其他函数如find_available_frame和find_remove_best_frame用于在帧中查找可用的和最佳帧。simulate函数用于模拟最佳置换算法的操作。 运行此程序时,它将提示用户输入页面数,参考字符串和帧数,并打印模拟输出和页面错误的数量。 希望这个c语言实现示例能够为您提供帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值